/**
 * 页面中需要进行ajax的所有api的列表
 */
var express = require('express');
var router = express.Router();
var config = require('./config.js');
var OAuth = require('wechat-oauth');
var WXPay = require('weixin-pay');
var AV = require('leanengine');
var wxjsapi = require('wx_jsapi_sign');
var async = require('async');
var log4js = require('log4js');
var logger = log4js.getLogger('normal');

var client = new OAuth(config.wx.app_id, config.wx.app_secret);

var wxpay = WXPay(config.wx.pay);
//订单的模型控制
var order = require('./models/order');
var charge = require('./models/modUser');
var WXPayNotify = require('./record').WxPayNotify;

//新用户注册
var signUp = function(oauth_user){
    var user1 = new AV.User();
    user1.set("username", oauth_user.openid);
    user1.set("nickname",  oauth_user.nickname);
    user1.set("password", "gr100");
    user1.set("openid", oauth_user.openid);
    user1.set("sex", oauth_user.sex);
    user1.set("city", oauth_user.city);
    user1.set("country", oauth_user.country);
    user1.set("province", oauth_user.province);
    user1.set("language", oauth_user.language);
    user1.set("headimgurl", oauth_user.headimgurl);
    user1.set("subscribe_time", oauth_user.subscribe_time);
    user1.set("level_id", 2);//会员等级
    user1.set("amount", 0);//会员余额
    user1.set("point", 0);//会员积分
    user1.set("status", 1);//会员积分
    user1.set("syncStatus", 1);
    return user1.signUp(null);
};

var redirectPage = function(req,res){
    if(global.backurl){
        res.redirect(decodeURIComponent(global.backurl));
    }else{
        res.redirect('/');
    }
}

// 主页,主要是负责OAuth认真
router.get('/', function(req, res) {

    global.backurl = req.query.back;
    var url = client.getAuthorizeURL('http://' + config.domain + '/wx/callback','');
    res.redirect(url);
})

/**
 * 认证授权后回调函数
 *
 * 根据openid判断是否用户已经存在
 * - 如果是新用户，注册并绑定，然后跳转到手机号验证界面
 * - 如果是老用户，跳转到主页
 */
router.get('/callback', function(req, res) {
    var code = req.query.code;
    console.log("============code============");
    console.log(code);
    client.getAccessToken(code, function (err, result) {
        if(err){
            logger.error('wx callback err:' + JSON.stringify(err));
            //TODO:微信登陆失败
            redirectPage(req,res);
            return;
        }
        //var accessToken = result.data.access_token;

        var openid = result.data.openid;

        //通过用户控制器进行登录
        //获取用户信息
        client.getUser(openid, function (err, user) {
            var oauth_user = user;
            //req.AV.user.set("wxheadimgurl", oauth_user.headimgurl);
            //req.AV.user.oauth_user=oauth_user;
            //获取用户信息，如果是新用户，则进行一次用户的注册
            var query = new AV.Query(AV.User);
            query.equalTo("openid", openid);

            query.first().then(function(u1){
                if(u1){
                    //查询成功,进行登录
                    AV.User.logIn(u1.get('username'), "gr100").then(function(u3){
                        /*console.log("=============登陆成功1===========");
                        console.log(oauth_user.headimgurl);
                        req.AV.user.set("wxheadimgurl", oauth_user.headimgurl);
                        console.log(req.AV.user);*/
                        redirectPage(req,res);
                    }).catch(function(e){
                        AV.User.logIn(u1.get('username'), "000000").then(function(u4){
                           /* console.log("=============登陆成功2===========");
                            req.AV.user.set("wxheadimgurl", oauth_user.headimgurl);
                            console.log(oauth_user.headimgurl);*/
                            redirectPage(req,res);
                        }).catch(function(e){
                            logger.error('user login err:'+' openid :' + openid + JSON.stringify(e));

                            redirectPage(req,res);
                        });
                    });
                }else{
                    //用户不存在
                    //注册一个新用户
                    signUp(oauth_user).then(function(u2){

                        redirectPage(req,res);
                    }).catch(function(e){
                        logger.error('user signUp err:' + JSON.stringify(e));

                        redirectPage(req,res);
                    });
                }

            });


        });
    });
});

router.post('/pay',function(req,res,next){
    logger.info('pay:'+JSON.stringify(req.body));
    //获取页面提交过来的数据
    var openid = req.AV.user.get('openid');
    var trade_no = req.body.trade_no || ('20150331'+Math.random().toString().substr(2, 10));//获取订单号
    var total_fee = req.body.total_fee|| 1;//获取订单金额，默认是1分钱
    //沙箱模式，金额默认为1分钱
    if(config.dev == 'STAGING'){
        total_fee = 1;
    }
    wxpay.getBrandWCPayRequestParams({
        openid:openid,
        body:'果然100支付,订单编号：'+trade_no,
        detail:'果然100支付,订单编号：'+trade_no,
        out_trade_no:trade_no,
        total_fee:total_fee,
        spbill_create_ip:'192.168.2.210',
        notify_url:'http://' + config.domain + '/wx/pay/notify'
    }, function(err, result){
        if(!err){
            logger.info('pay success:' + JSON.stringify(result));
            res.json(result);
        }else{
            logger.error('pay err:' + JSON.stringify(err));
            //TODO:按照错误的需求，输出错误信息
            res.status(500).json(err);
        }
    });
});

// 原生支付回调
router.use('/pay/native/callback', wxpay.useWXCallback(function(msg, req, res, next){
    // msg: 微信回调发送的数据

}));

/*//回调信息如下
 { appid: 'wxef9f343d05b97ba0',
 bank_type: 'CCB_CREDIT',
 cash_fee: '1',
 fee_type: 'CNY',
 is_subscribe: 'Y',
 mch_id: '1247833301',
 nonce_str: 'WbC37zqxXUDqkCJ5lvadA6Jgc53KcWcA',
 openid: 'oA7dTs1Vs-I1rGJb39FSF_ue2s78',
 out_trade_no: '201509032464929567',
 result_code: 'SUCCESS',
 return_code: 'SUCCESS',
 sign: 'CCFF29F2D272C06B328B302138FC8CB1',
 time_end: '20150903161645',
 total_fee: '1',
 trade_type: 'JSAPI',
 transaction_id: '1003390747201509030779650339' }

 */
// res.success() 向微信返回处理成功信息，res.fail()返回失败信息。
// 支付结果异步通知
router.use('/pay/notify', wxpay.useWXCallback(function(msg, req, rsp, next){
    // 处理商户业务逻辑
    if(!(msg.result_code == 'SUCCESS' && msg.return_code == 'SUCCESS')){
        logger.info('wx pay notify error:' + JSON.stringify(msg));
        res.fail();
        return;
    }
    var trade_no = msg.out_trade_no;
    var fee = parseInt(msg.cash_fee);
    async.waterfall([
            //记录日志
            function(callback){
                //查询该笔订单是否已经经过了回调的处理
                WXPayNotify.findOne({out_trade_no:trade_no},function(err,trade){
                    if(err){
                        //没有查询到，或者查询出错，则直接执行下面的回调信息
                        logger.error('wx pay notify msg query Error:' + JSON.stringify(err));
                        return callback(null,true);
                    }
                    console.log(trade);

                    if(trade){
                        //已回调成功
                        console.log(!trade.notify_flag);
                        return callback(null,!trade.notify_flag);
                    }else{
                        //未查找到该回调信息
                        var wxPayNotify = new WXPayNotify(msg);
                        wxPayNotify.save(function(err,wxp){
                            if(err){
                                logger.error('wx pay notify msg save Error:' + JSON.stringify(err));
                            }
                            return callback(null,true);
                        });
                    }

                    //失败的话则无论如何都进行回调
                    //return callback(null,true);
                });

            },
            function(flag,callback){
                if(flag === false){
                    //不用执行
                    callback(null,{});
                    return
                }
                //以O开头的订单编号为常规订单
                if(trade_no.indexOf('O')===0 || trade_no.indexOf('P')===0 || trade_no.indexOf('W')===0 || trade_no.indexOf('A')===0){
                    order.notify(trade_no,fee,'wx').then(function(res){
                        callback(null,res);
                    }).catch(function(err){
                        logger.error('wx pay notify error:' + JSON.stringify(err));
                        callback(err);
                    });
                }else if(trade_no.indexOf('C')===0){
                    //以C开头的为充值订单
                    charge.notify(trade_no,fee).then(function(res){
                        callback(null,res);
                    }).catch(function(err){
                        logger.error('wx charge notify error:');
                        callback(err);
                    });
                }else if(trade_no.indexOf('YX')===0){
                    //以YX开头的为元宵节活动充值订单
                    charge.notifyyx(trade_no,fee).then(function(res){
                        callback(null,res);
                    }).catch(function(err){
                        logger.error('wx charge notify error:');
                        callback(err);
                    });
                }else if(trade_no.indexOf('D')===0){
                    //以D开头的为门店自提订单
                    order.dnotify(trade_no,fee,'wx').then(function(res){
                        callback(null,res);
                    }).catch(function(err){
                        logger.error('wx pay notify error:' + JSON.stringify(err));
                        callback(err);
                    });
                }else{
                    //出现了非本系统的订单编号
                    callback({error:'wx pay notify CRASH:出现了非本系统的订单编号' + JSON.stringify(msg)});
                }
            }
        ]
        ,function(err,res){
            var f = false;
            if(err){
                logger.error('wx pay notify error:' + JSON.stringify(err));
                f = false;
                //等待微信继续调用
            }else{
                f = true;
            }
            //回写回调成功的状态位到mongo中
            WXPayNotify.update({out_trade_no:trade_no}, { $set: { notify_flag: f } }).exec(function(err,ures){
                if(err){
                    logger.error('wx pay notify msg update Error:' + JSON.stringify(err));
                    rsp.fail();
                }else{
                    if(f)
                        rsp.success();
                    else
                        rsp.fail();
                }

            });
            //if(f)
            //    rsp.success();
            //else
            //    rsp.fail();
    });
    //如果是无法处理的订单，则直接返回错误给微信
    //console.log('无法处理的订单信息');
    //rsp.fail();
}));


router.post('/getSignature',function(req,res){
    wxjsapi.getSignature({
        appId: config.wx.app_id,
        appSecret: config.wx.app_secret,
        cache_json_file:config.wx.cache_json_file})('http://'+config.domain,function(err,data){
        console.log(data);
        res.json(data);
    });
});

module.exports = router;